package br.com.virtual.base.listener;

import javax.ejb.Stateless;
import javax.persistence.PostPersist;
import javax.persistence.PostRemove;
import javax.persistence.PostUpdate;

import br.com.virtual.base.enums.ActionFormEnum;
import br.com.virtual.base.ientity.IEntity;
import br.com.virtual.base.model.VirtualModel;
import br.com.virtual.base.uteis.CDIFactory;
import br.com.virtual.replicar.model.Sincronizar;
import br.com.virtual.replicar.service.ReplicadorPreparadorEntidade;
import br.com.virtual.replicar.service.SincronizarService;

@Stateless
public class VirtualEntityListener {

	
	private SincronizarService sincronizarService;
	private ReplicadorPreparadorEntidade rplPreparadorEntidade;
	
	
	@PostPersist
	public void postPersist( VirtualModel virtualModel ){
		
		doReplicacao( createItemSincronizar(ActionFormEnum.CREATE, virtualModel.getClass().toString(), getId(virtualModel)));
	}
	
	
	
	@PostUpdate
	public void postUpdate( VirtualModel virtualModel ){

		doReplicacao( createItemSincronizar(ActionFormEnum.UPDATE, virtualModel.getClass().toString(), getId(virtualModel)));
	}
	
	
	
	@PostRemove
	public void postRemove( VirtualModel virtualModel ){
		
		doReplicacao( createItemSincronizar(ActionFormEnum.DELETE, virtualModel.getClass().toString(), getId(virtualModel)) );
	}
	

	
	private void doReplicacao(Sincronizar itemSincronizar){
		
		getSincronizarService().create(itemSincronizar);
		getRPLPreparadorEntidade().iniciarReplicacao();
	}
	

	private Sincronizar createItemSincronizar(ActionFormEnum acao, String classeEntidade, Long idEntidade){
		
		return new Sincronizar(acao, classeEntidade, idEntidade);
	}
	
	private Long getId(VirtualModel virtualModel){
		
		return ((IEntity)virtualModel).getId();
	}


	public ReplicadorPreparadorEntidade getRPLPreparadorEntidade() {
		if( rplPreparadorEntidade == null){
			rplPreparadorEntidade = CDIFactory
					.getBeanByName(ReplicadorPreparadorEntidade.class);
		}
		
		return rplPreparadorEntidade;
	}

	
	public SincronizarService getSincronizarService() {
		if( sincronizarService == null){
			sincronizarService = CDIFactory
					.getBeanByName(SincronizarService.class);
		}
		
		return sincronizarService;
	}
	
	
	public void setSincronizarService(
			SincronizarService sincronizarService) {
		this.sincronizarService = sincronizarService;
	}
}
